const osFs = require('fs');
const osPath = require('path');

// 检测文件或者文件夹存在
function fsExistsSync(sPath) {
  try {
    osFs.accessSync(absolutePath(sPath), osFs.F_OK);
  } catch (e) {
    return false;
  }
  return true;
}

/**
 * 相对路径转绝对路径
 * @param {*} sPath
 */
function absolutePath(sPath) {
  if (sPath.slice(0, 1) !== '~') {
    return sPath;
  }
  // 取home目录
  const sHome = process.env['HOME'];
  // 替换 ~
  return sPath.replace('~', sHome);
}

/**
 * 检查路径是否文件
 *
 * @param {string} sPath
 * return {boole} true
 */
function isFile(sPath) {
  oStat = osFs.lstatSync(sPath);
  return oStat.isFile();
}

/**
 * 检查路径是否文件夹
 *
 * @param {string} sPath
 * return {boole} true
 */
function isDir(sPath) {
  oStat = osFs.lstatSync(sPath);
  return oStat.isDirectory();
}

/**
 * 取文件格式 
 *
 * @param {*} sVal .js | .vue
 * @returns js
 */
function getExt(sVal) {
  return osPath.extname(sVal).slice(1);
}

/**
 * 递归建文件夹
 *
 * @param {*} sFileName
 * @returns
 */
function mkdirSync (psDirName) {
  if (osFs.existsSync(psDirName)) {
    return true;
  } else {
    if (mkdirSync(osPath.dirname(psDirName))) {
      osFs.mkdirSync(psDirName);
      return true;
    }
  }
  return false;
}

async function fnWriteFile(sReportPath, sData) {
  try {
    await osFs.writeFile(
      sReportPath,
      sData,
      'utf-8',
      (error) => {
        if(error){
          throw new Error(error);
        }
      }
    );
    return true;
  } catch (error) {
    throw new Error(error);
  }
}

module.exports = {
  fsExistsSync,
  absolutePath,
  isFile,
  isDir,
  getExt,
  mkdirSync,
  fnWriteFile,
};
